package com.feige.common.result;

import lombok.Data;

import java.io.Serializable;


/**
 * 统一返回对象
 *
 * @param 
 */
@Data
public class Result implements Serializable {


    /**
     * 返回状态码
     */
    private Integer code;

    /**
     * 描述信息
     */
    private String desc;

    /**
     * 返回数据
     */
    private Object data;


    private Result() {
    }

    public Result(Integer code) {
        this.code = code;
    }

    public Result(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public Result(Integer code, String desc, Object data) {
        this.code = code;
        this.desc = desc;
        this.data = data;
    }

    /**
     * 成功返回结果
     */
    public static  Result success() {
        return new Result(
                EResultCode.SUCCESS.getCode(),
                EResultCode.SUCCESS.getDesc(),
                null
        );
    }

    /**
     * 成功返回结果
     *
     * @param data 获取的数据
     */
    public static Result success(Object data) {
        return new Result(EResultCode.SUCCESS.getCode(),
                EResultCode.SUCCESS.getDesc(),
                data);
    }

    /**
     * 成功返回结果
     *
     * @param successCode 提示码
     */
    public static  Result success(Integer successCode) {
        return new Result(successCode);
    }

    /**
     * 成功返回结果
     *
     * @param successCode 提示码
     * @param desc        描述
     */
    public static  Result success(Integer successCode, String desc) {
        return new Result(successCode, desc);
    }

    /**
     * 成功返回结果
     *
     * @param successCode 提示码
     * @param data        获取的数据
     */
    public static  Result success(Integer successCode, Object data) {
        return new Result(successCode, "", data);
    }

    /**
     * 成功返回结果
     *
     * @param successCode 提示码
     * @param data        获取的数据
     * @param desc        提示信息
     */
    public static  Result success(Integer successCode, Object data, String desc) {
        return new Result(successCode, desc, data);
    }

    /**
     * 成功返回结果
     *
     * @param errorCode 封装API的返回码
     */
    public static  Result success(IResultCode errorCode) {
        return new Result(errorCode.getCode(), errorCode.getDesc(), null);
    }

    /**
     * 成功返回结果
     *
     * @param errorCode 封装API的返回码
     * @param data      获取的数据
     */
    public static  Result success(IResultCode errorCode, Object data) {
        return new Result(errorCode.getCode(), errorCode.getDesc(), data);
    }

    /**
     * 失败返回结果
     */
    public static  Result failed() {
        return new Result(
                EResultCode.FAILED.getCode(),
                EResultCode.FAILED.getDesc(),
                null);
    }

    /**
     * 失败返回结果
     *
     * @param desc 错误信息
     */
    public static  Result failed(String desc) {
        return new Result(
                EResultCode.FAILED.getCode(),
                desc,
                null);
    }

    /**
     * 失败返回结果
     *
     * @param resultCode 返回码
     */
    public static  Result failed(Integer resultCode) {
        return new Result(
                resultCode,
                "",
                null);
    }

    /**
     * 失败返回结果
     *
     * @param errorCode 错误码
     */
    public static  Result failed(IResultCode errorCode) {
        return new Result(
                errorCode.getCode(),
                errorCode.getDesc(),
                null);
    }

    /**
     * 失败返回结果
     *
     * @param errorCode 错误码
     * @param desc      错误信息
     */
    public static  Result failed(Integer errorCode, String desc) {
        return new Result(errorCode, desc);
    }

    /**
     * 失败返回结果
     *
     * @param errorCode 错误码
     * @param data      数据
     */
    public static  Result failed(IResultCode errorCode, Object data) {
        return new Result(errorCode.getCode(),
                errorCode.getDesc(),
                data);
    }

    /**
     * 失败返回结果
     *
     * @param errorCode 错误码
     * @param desc      错误信息
     * @param data      数据
     */
    public static  Result failed(Integer errorCode, String desc, Object data) {
        return new Result(errorCode, desc, data);
    }

}
